package br.gov.mj.sislegis.app.rest;
import java.io.IOException;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import javax.ejb.EJBTransactionRolledbackException;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriBuilder;
import br.gov.mj.sislegis.app.model.PosicionamentoProposicao;
import br.gov.mj.sislegis.app.model.Proposicao;
import br.gov.mj.sislegis.app.model.Reuniao;
import br.gov.mj.sislegis.app.model.Usuario;
import org.jboss.resteasy.annotations.cache.Cache;
import br.gov.mj.sislegis.app.enumerated.Origem;
import br.gov.mj.sislegis.app.model.pautacomissao.PautaReuniaoComissao;
import br.gov.mj.sislegis.app.model.pautacomissao.ProposicaoPautaComissao;
import br.gov.mj.sislegis.app.parser.TipoProposicao;
import br.gov.mj.sislegis.app.rest.authentication.UsuarioAutenticadoBean;
import br.gov.mj.sislegis.app.service.ProposicaoService;
import br.gov.mj.sislegis.app.service.ReuniaoService;
/**
*
*/
@Path("/proposicaos")
public class ProposicaoEndpoint {
@Inject
private ProposicaoService proposicaoService;
@GET
@Path("/proposicoesPautaCamara")
@Produces(MediaType.APPLICATION_JSON)
public Set<PautaReuniaoComissao> buscarProposicoesPautaCamara(@QueryParam("idComissao") Long idComissao,
@QueryParam("data") Date data) throws Exception {
Map<String, Object> parametros = new HashMap<String, Object>();
parametros.put("idComissao", idComissao);
parametros.put("data", data);
Set<PautaReuniaoComissao> lista = proposicaoService.buscarProposicoesPautaCamaraWS(parametros);
return lista;
}
@GET
@Path("/proposicoesPautaSenado")
@Produces(MediaType.APPLICATION_JSON)
public Set<PautaReuniaoComissao> buscarProposicoesPautaSenado(@QueryParam("siglaComissao") String siglaComissao,
@QueryParam("data") Date data) throws Exception {
Map<String, Object> parametros = new HashMap<>();
parametros.put("siglaComissao", siglaComissao);
parametros.put("data", data);
return proposicaoService.buscarProposicoesPautaSenadoWS(parametros);
}
@GET
@Path("/detalharProposicaoCamaraWS")
@Produces(MediaType.APPLICATION_JSON)
public Proposicao detalharProposicaoCamaraWS(@QueryParam("id") Long id) throws Exception {
return proposicaoService.detalharProposicaoCamaraWS(id);
}
@GET
@Path("/detalharProposicaoSenadoWS")
@Produces(MediaType.APPLICATION_JSON)
public Proposicao detalharProposicaoSenadoWS(@QueryParam("id") Long id) throws Exception {
return proposicaoService.detalharProposicaoSenadoWS(id);
}
@POST
@Path("/salvarProposicoes")
@Consumes(MediaType.APPLICATION_JSON)
public Response salvarProposicoes(List<Proposicao> listaProposicoesSelecionados) {
// nao é usada mais
return Response.status(Status.SERVICE_UNAVAILABLE).build();
}
@Inject
private ReuniaoService serviceReuniao;
@POST
@Path("/salvarProposicoesDePauta")
@Consumes(MediaType.APPLICATION_JSON)
public Response adicionaProposicoesDePautaEmReuniao(AddProposicaoPautaWrapper proposicaoPautaWrapper) {
try {
Date reuniaoDate = new Date(proposicaoPautaWrapper.getReuniaoDate());
Reuniao reuniao = null;
try {
reuniao = serviceReuniao.buscaReuniaoPorData(reuniaoDate);
} catch (Exception e) {
System.err.println("E " + e.getMessage());
}
if (reuniao == null) {
reuniao = new Reuniao();
reuniao.setData(reuniaoDate);
}
proposicaoService.adicionaProposicoesReuniao(proposicaoPautaWrapper.getPautaReunioes(), reuniao);
return Response.noContent().build();
} catch (IOException e) {
e.printStackTrace();
return Response.status(Status.SERVICE_UNAVAILABLE).build();
}
}
@POST
@Path("/salvarProposicaoExtra")
@Consumes(MediaType.APPLICATION_JSON)
public Response salvarProposicoes(Proposicao proposicao) {
try {
int result = proposicaoService.salvarProposicaoIndependente(proposicao);
switch (result) {
case 0:
return Response.status(Response.Status.OK).build();
case 1:
return Response.status(Response.Status.CREATED).build();
case -1:
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
}
} catch (EJBTransactionRolledbackException e) {
return Response.status(Response.Status.CONFLICT).build();
}
return Response.noContent().build();
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response create(Proposicao entity) {
proposicaoService.save(entity);
return Response.created(
UriBuilder.fromResource(ProposicaoEndpoint.class).path(String.valueOf(entity.getId())).build()).build();
}
@DELETE
@Path("/{id:[0-9][0-9]*}")
public Response deleteById(@PathParam("id") Long id) {
proposicaoService.deleteById(id);
return Response.noContent().build();
}
@DELETE
@Path("/{id:[0-9][0-9]*}/{reuniaoId:[0-9][0-9]*}")
public Response deleteById(@PathParam("id") Long id, @PathParam("reuniaoId") Long reuniaoId) {
return Response.noContent().build();
}
@GET
@Path("/{id:[0-9][0-9]*}")
@Produces(MediaType.APPLICATION_JSON)
public Response findById(@PathParam("id") Integer id) {
return Response.ok(proposicaoService.buscarPorId(id)).build();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Proposicao> listAll() {
return proposicaoService.listarTodos();
}
@GET
@Path("/consultar")
@Produces(MediaType.APPLICATION_JSON)
public List<Proposicao> consultar(@QueryParam("ementa") String ementa, @QueryParam("autor") String autor,
@QueryParam("sigla") String sigla, @QueryParam("origem") String origem,
@QueryParam("isFavorita") String isFavorita, @QueryParam("limit") Integer limit,
@QueryParam("offset") Integer offset) {
List<Proposicao> results = proposicaoService.consultar(sigla, autor, ementa, origem, isFavorita, offset, limit);
return results;
}
@GET
@Path("/buscarPorSufixo")
@Produces(MediaType.APPLICATION_JSON)
public List<Proposicao> buscarPorSufixo(@QueryParam("sufixo") String sufixo) {
return proposicaoService.buscarPorSufixo(sufixo);
}
@PUT
@Path("/{id:[0-9][0-9]*}")
@Consumes(MediaType.APPLICATION_JSON)
public Response update(Proposicao entity) {
proposicaoService.save(entity);
return Response.noContent().build();
}
@GET
@Path("/buscaIndependente/{origem:[A-Z]*}/{tipo:[A-Z\\.]*}/{ano:[0-9]{4}}")
@Produces(MediaType.APPLICATION_JSON)
public Collection<Proposicao> buscaIndependente(@PathParam("origem") String origem, @PathParam("tipo") String tipo,
@QueryParam("numero") Integer numero, @PathParam("ano") Integer ano) throws Exception {
return proposicaoService.buscaProposicaoIndependentePor(Origem.valueOf(origem), tipo, numero, ano);
}
@GET
@Path("/listTipos/CAMARA")
@Cache(maxAge = 24, noStore = false, isPrivate = false, sMaxAge = 24)
@Produces(MediaType.APPLICATION_JSON)
public Collection<TipoProposicao> listTiposCamara() throws Exception {
return proposicaoService.listTipos(Origem.CAMARA);
}
@GET
@Path("/listTipos/SENADO")
@Cache(maxAge = 24, noStore = false, isPrivate = false, sMaxAge = 24)
@Produces(MediaType.APPLICATION_JSON)
public Collection<TipoProposicao> listTiposSenado() throws Exception {
return proposicaoService.listTipos(Origem.SENADO);
}
@Inject
private UsuarioAutenticadoBean controleUsuarioAutenticado;
@POST
@Path("/follow/{id:[0-9]+}")
public Response follow(@PathParam("id") Long id, @HeaderParam("Authorization") String authorization) {
try {
Usuario user = controleUsuarioAutenticado.carregaUsuarioAutenticado(authorization);
proposicaoService.followProposicao(user, id);
return Response.noContent().build();
} catch (Exception e) {
e.printStackTrace();
return Response.status(Response.Status.BAD_REQUEST).build();
}
}
@POST
@Path("/check4updates/{id:[0-9]+}")
public Response syncpauta(@PathParam("id") Long id) {
try {
if (proposicaoService.syncDadosPautaProposicao(id) || proposicaoService.syncDadosProposicao(id)) {
return Response.status(Status.ACCEPTED).entity(proposicaoService.findById(id)).build();
} else {
return Response.status(Status.NOT_MODIFIED).build();
}
} catch (Exception e) {
e.printStackTrace();
return Response.status(Response.Status.BAD_REQUEST).build();
}
}
@DELETE
@Path("/follow/{id:[0-9]+}")
public Response unfollow(@PathParam("id") Long id, @HeaderParam("Authorization") String authorization) {
try {
Usuario user = controleUsuarioAutenticado.carregaUsuarioAutenticado(authorization);
proposicaoService.unfollowProposicao(user, id);
return Response.noContent().build();
} catch (Exception e) {
e.printStackTrace();
return Response.status(Response.Status.BAD_REQUEST).build();
}
}
@POST
@Path("/alterarPosicionamento")
@Consumes(MediaType.APPLICATION_JSON)
public Response alterarPosicionamento(PosicionamentoProposicaoWrapper posicionamentoProposicaoWrapper,
@HeaderParam("Authorization") String authorization) {
try {
Usuario usuarioLogado = controleUsuarioAutenticado.carregaUsuarioAutenticado(authorization);
proposicaoService.alterarPosicionamento(posicionamentoProposicaoWrapper.getId(),
posicionamentoProposicaoWrapper.getIdPosicionamento(), posicionamentoProposicaoWrapper.preliminar, usuarioLogado);
return Response.ok().build();
} catch (Exception e) {
e.printStackTrace();
return Response.status(Response.Status.BAD_REQUEST).build();
}
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/historicoPosicionamentos/{id:[0-9]+}")
public List<PosicionamentoProposicao> historicoPosicionamentos(@PathParam("id") Long id) {
return proposicaoService.listarHistoricoPosicionamentos(id);
}
@GET
@Path("/{id:[0-9]+}/pautas")
@Cache(maxAge = 24, noStore = false, isPrivate = false, sMaxAge = 24)
@Produces(MediaType.APPLICATION_JSON)
public SortedSet<ProposicaoPautaComissao> listPautasProposicao(@PathParam("id") Long id) throws Exception {
return proposicaoService.findById(id).getPautasComissoes();
}
@POST
@Path("/setRoadmapComissoes")
@Consumes(MediaType.APPLICATION_JSON)
public Response setRoadmapComissoes(RoadmapComissoesWrapper roadmapComissoesWrapper){
try {
proposicaoService.setRoadmapComissoes(roadmapComissoesWrapper.getIdProposicao(), roadmapComissoesWrapper.getComissoes());
return Response.ok().build();
} catch (Exception e) {
e.printStackTrace();
return Response.status(Response.Status.BAD_REQUEST).build();
}
}
}
class AddProposicaoPautaWrapper {
Set<PautaReuniaoComissao> pautaReunioes;
long reuniaoDate;
public Set<PautaReuniaoComissao> getPautaReunioes() {
return pautaReunioes;
}
public void setPautaReunioes(Set<PautaReuniaoComissao> pautaReunioes) {
this.pautaReunioes = pautaReunioes;
}
public long getReuniaoDate() {
return reuniaoDate;
}
public void setReuniaoDate(long reuniaoDate) {
this.reuniaoDate = reuniaoDate;
}
}
class PosicionamentoProposicaoWrapper {
Long id;
Long idPosicionamento;
boolean preliminar;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getIdPosicionamento() {
return idPosicionamento;
}
public void setIdPosicionamento(Long idPosicionamento) {
this.idPosicionamento = idPosicionamento;
}
public boolean isPreliminar() {
return preliminar;
}
public void setPreliminar(boolean preliminar) {
this.preliminar = preliminar;
}
}
class RoadmapComissoesWrapper{
private Long idProposicao;
private List<String> comissoes;
public Long getIdProposicao() {
return idProposicao;
}
public void setIdProposicao(Long idProposicao) {
this.idProposicao = idProposicao;
}
public List<String> getComissoes() {
return comissoes;
}
public void setComissoes(List<String> comissoes) {
this.comissoes = comissoes;
}
}